from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.utils.deconstruct import deconstructible
from mall import settings
# 1.您的自定义存储系统必须是以下子类 django.core.files.storage.Storage
# 4. django.utils.deconstruct.deconstructible类装饰器

@deconstructible
class MyStorage(Storage):

	# 2.Django必须能够在没有任何参数的情况下实例化您的存储系统。
	# 这意味着任何设置都应该来自django.conf.settings
	def __init__(self, conf_path=None , ip=None):
		if not conf_path:
			conf_path = settings.FDFS_CLIENT_CONF
		self.conf_path = conf_path

		if not ip:
			ip = settings.FDFS_URL
		self.ip = ip


	# 3.您的存储类必须实现_open()和_save() 方法以及适用于您的存储类的任何其他方法

	# 打开图片
	# 我们的图片是通过 http://访问来获取到的
	# 所以不需要打开
	def _open(self, name, mode='rb'):
		pass

	# 保存
	def _save(self, name, content, max_length=None):

		# 1.创建FastDFS客户端
		# 客户端的配置信息路径
		# client = Fdfs_client('utils/fastdfs/client.conf')
		# client = Fdfs_client(settings.FDFS_CLIENT_CONF)
		client = Fdfs_client(self.conf_path)

		# 2.获取图片

		# name 只是图片的名字
		# 只有一个名字我们没有办法实现上传

		#  content内容
		# content就是图片的内容数据，我们通过read来读取
		# 读取的是二进制数据
		data = content.read()

		# 3.上传
		# client.upload_by_filename()  根据文件的绝对路径来上传
		# upload_by_filename  上传二进制

		# result  就是上传的结果
		result = client.upload_by_buffer(data)

		"""
		{'Local file name': '/home/python/Desktop/cat.jpg',
		'Remote file_id': 'group1/M00/00/00/wKgojVvs2VKAGboAAAAQ7colEzw736.jpg',
		'Storage IP': '192.168.40.141',
		'Group name': 'group1',
		'Uploaded size': '4.00KB',
		'Status': 'Upload successed.'}

		"""

		# 4.根据上传结果 获取fild_id
		if result.get('Status') == 'Upload successed.':
			file_id = result.get('Remote file_id')

			# 我们把file_id返回给系统就可以
			return file_id
		else:
			raise Exception('上传失败')


	# 判断是否存在exists
	# 因为Fdfs实现了文件的去重处理，会对重复的文件进行重命名处理
	# 所以 不需要要判断是否存在，尽管上传
	def exists(self, name):
		return False

	def url(self, name):
		# name 其实就是 file_id

		# url 应该是一个 http://ip:port/+ name 才可以完整的访问我们的图片
		# return ''http://192.168.40.143:8888/' + name
		# return settings.FDFS_URL + name
		return self.ip + name
